package com.bryant.demo05.ui.me

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.bryant.demo05.R
import com.bryant.demo05.WeatherApplication
import com.bryant.demo05.base.BaseBindingActivity
import com.bryant.demo05.databinding.ActChangeAvatarBinding
import com.bryant.demo05.storage.TokenPreferences
import com.bryant.demo05.utils.AvatarUploader
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import kotlinx.coroutines.launch


class ChangeAvatarActivity : BaseBindingActivity<ActChangeAvatarBinding>() {

    private val REQUEST_IMAGE_CAPTURE = 1 // 相机请求码
    private val REQUEST_IMAGE_PICK = 2 // 相册请求码

    // 接受头像地址
    private var avatarUrl: String? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setOnClickEvent()

        // 从全局中获取头像地址并赋值
        avatarUrl = WeatherApplication.user.avatar  // 网络图片
        // 将网络图片地址赋值给控件
        loadAvatar(avatarUrl ?: "")
    }

    override fun initBinding(layoutInflater: LayoutInflater): ActChangeAvatarBinding {
        return ActChangeAvatarBinding.inflate(layoutInflater)
    }

    // 设置点击事件（全部点击事件封装在这）
    private fun setOnClickEvent() {
        // 1. 设置返回按钮点击事件
        binding.ivBack.setOnClickListener {
            finish()
        }
        // 2. 设置点击头像选择点击事件
       binding.ivAvatar.setOnClickListener {
            showChooseAvatarDialog()
        }
        binding.ivEditAvatar.setOnClickListener {
            showChooseAvatarDialog()
        }
    }

    // 设置选择头像弹层
    private fun showChooseAvatarDialog() {
        // 1. 创建一个alert选择弹层
        val alertDialog = android.app.AlertDialog.Builder(this)
        alertDialog.setTitle("选择头像")
        alertDialog.setItems(arrayOf("拍照", "相册", "取消")) { dialog, which ->
            when (which) {
                0 -> {
                    // 拍照
                    takePhoto()
                }

                1 -> {
                    // 相册
                    choosePhoto()
                }

                2 -> {
                    // 取消
                    dialog.dismiss()
                }

            }
        }
            .create()
        alertDialog.show()
    }

    // 拍照上传
    private fun takePhoto() {
        Log.d("ChangeAvatarActivity-----", "拍照上传")
    }

    // 选择相册上传
    @SuppressLint("IntentReset")
    private fun choosePhoto() {
        //  1. 创建一个意图打开相册选择图片 , 图片的来源为外部存储的图片媒体
        val intent = Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        // 2. 约束图片的类型
        intent.type = "image/*"
        // 3. 启动意图
        startActivityForResult(intent, REQUEST_IMAGE_PICK)
    }

    /**
     * onActivityResult 是在启动另一个 Activity 并返回结果时被调用的生命周期方法。
     * requestCode 用来标识发起请求的来源（比如是从哪个按钮点击出发的）
     * resultCode 表示返回的结果状态（成功或失败）
     * data 是返回的数据，通常包含用户选择或操作后产生的信息
     */
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        // 检查结果是否成功
        if (resultCode == Activity.RESULT_OK) {
            when (requestCode) {
                // 如果是来自图片选择器的请求
                REQUEST_IMAGE_PICK -> {
                    // 使用安全调用操作符访问data对象的data属性（即URI），如果存在则执行lambda表达式
                    data?.data?.let { uri ->
                       // 上传图片
                        uploadImage(uri)
                    }
                }
            }
        }
    }
    private fun uploadImage(uri: Uri) {
        // 开启协程
        lifecycleScope.launch {
          // 1. 获取toekn
            val token = TokenPreferences.getInstance(this@ChangeAvatarActivity).getToken() as String
            // 2. 调用工具类完成地址转换 - 上传等
            AvatarUploader(this@ChangeAvatarActivity,  token){ avatarUrl, error ->
                if (error != null){
                    // 处理错误
                    Log.e("上传头像错误", error)
                } else {
                    loadAvatar(avatarUrl.toString())
                }
            }.uploadAvatar( uri)
        }
    }
    // 加载头像（头像是网络图片）
    private fun loadAvatar(url: String) {
        lifecycleScope.launch {
            Glide.with(this@ChangeAvatarActivity)
                .load(url)
                .apply(
                    RequestOptions()
                        .circleCrop()
                        .placeholder(R.mipmap.avatar1)
                        .error(R.mipmap.avatar1)
                )
                // 绑定图片
                .into(binding.ivAvatar)
        }
    }
}